package br.edu.ufcg.p1.barzin;

import java.util.List;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import br.edu.ufcg.p1.barzin.event.Assinante;
import br.edu.ufcg.p1.barzin.event.ContaFechadaEvento;
import br.edu.ufcg.p1.barzin.event.EventBus;
import br.edu.ufcg.p1.barzin.event.EventoBase;
import br.edu.ufcg.p1.barzin.event.PedidoAlteradoEvento;
import br.edu.ufcg.p1.barzin.event.PedidoRealizadoEvento;
import br.edu.ufcg.p1.barzin.event.TiposDeEventos;
import br.edu.ufcg.p1.barzin.gui.PedidosUtil;
import br.edu.ufcg.p1.barzin.model.Pedido;
import br.edu.ufcg.p1.barzin.model.Resumo;

@SuppressWarnings("rawtypes")
public class ResumosFragment extends ListFragment implements
		Assinante<EventoBase> {

	private ListaResumoAdapter listAdapter;
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.resumos_fragment, container,
				false);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		this.listAdapter = new ListaResumoAdapter(getActivity(),
				R.layout.resumos_lista_list_item);

		List<Resumo> resumos = App.environment().getDao().recuperaResumos();
		for (Resumo resumo : resumos) {
			listAdapter.add(resumo);
		}
		
		setListAdapter(this.listAdapter);

		EventBus.getInstance().registraAssinante(
				TiposDeEventos.PEDIDO_ALTERADO, this);
		EventBus.getInstance().registraAssinante(
				TiposDeEventos.CONTA_FECHADA, this);
	}

//	@Override
	public void trataEvento(EventoBase evento) {
		if (evento instanceof PedidoAlteradoEvento) {
			this.listAdapter.trataPedidoAlterado(((PedidoAlteradoEvento)evento).getDado());
		} else if (evento instanceof ContaFechadaEvento) {
			this.listAdapter.limpa();
		}
	}

	private void mostraDialogPedido(Resumo itemQuantidade) {
		Dialog dialog = PedidosUtil.getDialogVerPedidos(itemQuantidade, getActivity(), getLayoutInflater(getArguments()), getFragmentManager());
		dialog.show();
	}
	
	class ListaResumoAdapter extends ArrayAdapter<Resumo> implements Assinante<PedidoRealizadoEvento> {

		public ListaResumoAdapter(Context context,
				int textViewResourceId) {
			super(context, textViewResourceId);
			
			EventBus.getInstance().registraAssinante(
					TiposDeEventos.PEDIDO_REALIZADO, this);
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup viewGroup) {
			View itemView = convertView;

			if (itemView == null) {
				itemView = getLayoutInflater(getArguments()).inflate(
						R.layout.resumos_lista_list_item, null);
			}

			final Resumo resumo = this.getItem(position);

			String nome = resumo.getItem().getNome();
			if (!resumo.isPedidosRecebidos()) {
				//nome += " *";
				itemView.setBackgroundColor(0xffff6c00);
				itemView.setOnClickListener(new OnClickListener() {
//					@Override
					public void onClick(View v) {
						mostraDialogPedido(resumo);
					}
				});
			} else {
				itemView.setBackgroundColor(Color.TRANSPARENT);
			}
			
			((TextView) itemView.findViewById(R.id.resumosLLINome))
					.setText(nome);
				
			((TextView) itemView.findViewById(R.id.resumosLLIValor))
					.setText("R$ " + resumo.getValor());
			
			((TextView) itemView.findViewById(R.id.resumosLLIQuantidade))
					.setText(" (" + resumo.getQuantidade() + ")");

			
			return itemView;
		}
		
		public void trataPedidoAlterado(Pedido pedido) {
			List<Resumo> resumos = App.environment().getDao().recuperaResumos();
			
			for (Resumo resumo : resumos) {
				int pos = getPosition(resumo);
				if (pos >= 0) {
					Resumo resumo2 = getItem(pos);
					if (resumo2.getItem().equals(pedido.getItem())) {
						resumo2.atualizaPedido(pedido);
					}
				}
			}
			this.notifyDataSetChanged();
		}
		
		public void limpa() {
			
			for (int i = getCount()-1; i >= 0; i--) {
				this.remove(this.getItem(i));
			}
			
			this.notifyDataSetChanged();
		}
		
//		@Override
		public void trataEvento(PedidoRealizadoEvento evento) {
			List<Resumo> resumos = App.environment().getDao().recuperaResumos();
			
			for (Resumo resumo : resumos) {
				int pos = getPosition(resumo);
				if (pos < 0) {
					this.add(resumo);
				} else {
					Resumo resumo2 = getItem(pos);
					if (resumo2.getItem().equals(evento.getDado().getItem())) {
						resumo2.addPedido(evento.getDado());
					}
				}
			}
			this.notifyDataSetChanged();
		}
	}

}